// cf-301d
// 题意：
// 给定 1~n 不同的n(<=2*10^5)个数，记作a，现在有m(<=2*10^5)个不同的询问，
// 每个询问是一个区间[l, r]，你要计算这个区间中(p, w)对的个数，满足
// a[p] 是 a[w] 的因子，且p和w都在[l, r]区间里。
//
// 题解：
// 这样不同的因子对数为O(nlogn)对，那么我们可以离线解决这个问题，首先把
// 所有因子对和询问按左端点从大到小排序，然后用树状数组维护右端点，
// 然后区间和就是答案。
//
// ml:run = $bin < input
#include <iostream>
#include <algorithm>
#include <vector>

using ll = long long;
int const maxn = 200007;
int a[maxn];
int pos[maxn];
ll ans[maxn];
ll tree[maxn];
int n, m;

struct data { int l, r, id; };
bool operator<(data const& a, data const& b) { return a.l > b.l; }

std::vector<data> query;
std::vector<std::vector<int>> pair;

int lowbit(int x) { return x & -x; }

void tree_add(int id, int d)
{
    for (; id <= n; id += lowbit(id)) tree[id] += d;
}

ll tree_sum(int id)
{
    ll ret = 0;
    for (; id > 0; id -= lowbit(id)) ret += tree[id];
    return ret;
}

ll sum(int l, int r)
{
    return tree_sum(r) - tree_sum(l - 1);
}

void handle_pair(int a, int b)
{
    a = pos[a]; b = pos[b];
    if (a > b) std::swap(a, b);
    pair[a].push_back(b);
}

void work()
{
    pair.resize(n + 1);
    for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j += i)
            handle_pair(i, j);

    int p = 0, len = query.size();
    for (int i = n; i > 0; i--) {
        for (auto j : pair[i]) tree_add(j, 1);
        for (; p < len && query[p].l >= i; p++)
            ans[query[p].id] = sum(query[p].l, query[p].r);
    }

    for (int i = 0; i < m; i++)
        std::cout << ans[i] << "\n";
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
        pos[a[i]] = i;
    }

    query.resize(m);
    for (int i = 0; i < m; i++) {
        std::cin >> query[i].l >> query[i].r;
        query[i].id = i;
    }
    std::sort(query.begin(), query.end());

    work();
}

